from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer, SerializerMethodField

from school.models import Classes
from user.serializer import UserSerializer


class ClassesSerializer(ModelSerializer):
    class Meta:
        model = Classes
        exclude = ['is_delete']  # 排除不必要的字段
        extra_kwargs = {  # 修改字段的属性
            'member': {'write_only': True}  # member字段为只写
        }

    # 此处自定义字段有些许差异，因user表是别人已写好时，我们需要定义user表的序列化器，
    # 但这样写还有一个缺点，就是展示出来的字段太复杂，还得再次优化，所以我们不用
    # member = UserSerializer(many=True)

    # SerializerMethodField为序列化器方法字段，获取此类下面的get_member函数方法返回的值
    member_detail = SerializerMethodField()

    # 注意，函数名一定要跟要修改的字段名一样，因为修改的字段用了序列化器方法字段后，
    # 改字段就会去找和他字段名一样的get函数方法
    def get_member_detail(self, classes):
        serializer = UserSerializer(classes.member.all(), many=True)  # 正向查询
        # 构造你想要的字段
        data= {
            # 分组，老师组id是1，学生组id是2
            'teacher': [i for i in serializer.data if 1 in i['groups'] or i['is_superuser']],
            'student': [i for i in serializer.data if 2 in i['groups']]
        }
        return data